
<!DOCTYPE HTML>
<html lang="" >
    <head>
        <meta charset="UTF-8">
        <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
        <title>加入最后的拼图 · GitBook</title>
        <meta http-equiv="X-UA-Compatible" content="IE=edge" />
        <meta name="description" content="">
        <meta name="generator" content="GitBook 3.2.3">
        
        
        
    
    <link rel="stylesheet" href="gitbook/style.css">

    
            
                
                <link rel="stylesheet" href="gitbook/gitbook-plugin-page-footer-ex/style/plugin.css">
                
            
                
                <link rel="stylesheet" href="gitbook/gitbook-plugin-ace/ace.css">
                
            
                
                <link rel="stylesheet" href="gitbook/gitbook-plugin-highlight/website.css">
                
            
                
                <link rel="stylesheet" href="gitbook/gitbook-plugin-search/search.css">
                
            
                
                <link rel="stylesheet" href="gitbook/gitbook-plugin-fontsettings/website.css">
                
            
        

    

    
        
        <link rel="stylesheet" href="styles.css">
        
    
        
    

        
    
    
    <meta name="HandheldFriendly" content="true"/>
    <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
    <meta name="apple-mobile-web-app-capable" content="yes">
    <meta name="apple-mobile-web-app-status-bar-style" content="black">
    <link rel="apple-touch-icon-precomposed" sizes="152x152" href="gitbook/images/apple-touch-icon-precomposed-152.png">
    <link rel="shortcut icon" href="gitbook/images/favicon.ico" type="image/x-icon">

    
    <link rel="next" href="4.5.html" />
    
    
    <link rel="prev" href="4.3.html" />
    

    </head>
    <body>
        
<div class="book">
    <div class="book-summary">
        
            
<div id="book-search-input" role="search">
    <input type="text" placeholder="Type to search" />
</div>

            
                <nav role="navigation">
                


<ul class="summary">
    
    

    

    
        
        
    
        <li class="chapter " data-level="1.1" data-path="./">
            
                <a href="./">
            
                    
                    Introduction
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.2" data-path="PA0.html">
            
                <a href="PA0.html">
            
                    
                    PA0 - 世界诞生的前夜: 开发环境配置
            
                </a>
            

            
            <ul class="articles">
                
    
        <li class="chapter " data-level="1.2.1" data-path="0.1.html">
            
                <a href="0.1.html">
            
                    
                    Installing a GNU/Linux VM
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.2.2" data-path="0.2.html">
            
                <a href="0.2.html">
            
                    
                    First Exploration with GNU/Linux
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.2.3" data-path="0.3.html">
            
                <a href="0.3.html">
            
                    
                    Installing More Tools
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.2.4" data-path="0.4.html">
            
                <a href="0.4.html">
            
                    
                    More Exploration
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.2.5" data-path="0.5.html">
            
                <a href="0.5.html">
            
                    
                    Logging in via SSH
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.2.6" data-path="0.6.html">
            
                <a href="0.6.html">
            
                    
                    Transferring Files between host and VM
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.2.7" data-path="0.7.html">
            
                <a href="0.7.html">
            
                    
                    Acquiring Source Code for PAs
            
                </a>
            

            
        </li>
    

            </ul>
            
        </li>
    
        <li class="chapter " data-level="1.3" data-path="PA1.html">
            
                <a href="PA1.html">
            
                    
                    PA1 - 洞察世界的视点: 简易调试器
            
                </a>
            

            
            <ul class="articles">
                
    
        <li class="chapter " data-level="1.3.1" data-path="1.1.html">
            
                <a href="1.1.html">
            
                    
                    在开始愉快的PA之旅之前
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.3.2" data-path="1.2.html">
            
                <a href="1.2.html">
            
                    
                    RTFSC
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.3.3" data-path="1.3.html">
            
                <a href="1.3.html">
            
                    
                    简易调试器
            
                </a>
            

            
            <ul class="articles">
                
    
        <li class="chapter " data-level="1.3.3.1" data-path="1.3.1.html">
            
                <a href="1.3.1.html">
            
                    
                    基本功能
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.3.3.2" data-path="1.3.2.html">
            
                <a href="1.3.2.html">
            
                    
                    表达式求值
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.3.3.3" data-path="1.3.3.html">
            
                <a href="1.3.3.html">
            
                    
                    监视点
            
                </a>
            

            
        </li>
    

            </ul>
            
        </li>
    
        <li class="chapter " data-level="1.3.4" data-path="1.4.html">
            
                <a href="1.4.html">
            
                    
                    熟悉i386手册
            
                </a>
            

            
        </li>
    

            </ul>
            
        </li>
    
        <li class="chapter " data-level="1.4" data-path="PA2.html">
            
                <a href="PA2.html">
            
                    
                    PA2 - 不停计算的机器: 指令系统
            
                </a>
            

            
            <ul class="articles">
                
    
        <li class="chapter " data-level="1.4.1" data-path="2.1.html">
            
                <a href="2.1.html">
            
                    
                    x86指令系统简介
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.4.2" data-path="2.2.html">
            
                <a href="2.2.html">
            
                    
                    RTFSC(2)
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.4.3" data-path="2.3.html">
            
                <a href="2.3.html">
            
                    
                    运行第一个C程序
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.4.4" data-path="2.4.html">
            
                <a href="2.4.html">
            
                    
                    实现更多的指令
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.4.5" data-path="2.5.html">
            
                <a href="2.5.html">
            
                    
                    简易调试器(2)
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.4.6" data-path="2.6.html">
            
                <a href="2.6.html">
            
                    
                    实现加载程序的loader
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.4.7" data-path="2.7.html">
            
                <a href="2.7.html">
            
                    
                    运行hello-str程序
            
                </a>
            

            
        </li>
    

            </ul>
            
        </li>
    
        <li class="chapter " data-level="1.5" data-path="PA3.html">
            
                <a href="PA3.html">
            
                    
                    PA3 - 虚实交错的魔法: 存储管理
            
                </a>
            

            
            <ul class="articles">
                
    
        <li class="chapter " data-level="1.5.1" data-path="3.1.html">
            
                <a href="3.1.html">
            
                    
                    Cache的故事
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.5.2" data-path="3.2.html">
            
                <a href="3.2.html">
            
                    
                    IA-32的故事
            
                </a>
            

            
            <ul class="articles">
                
    
        <li class="chapter " data-level="1.5.2.1" data-path="3.2.1.html">
            
                <a href="3.2.1.html">
            
                    
                    混沌初开
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.5.2.2" data-path="3.2.2.html">
            
                <a href="3.2.2.html">
            
                    
                    建立新秩序
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.5.2.3" data-path="3.2.3.html">
            
                <a href="3.2.3.html">
            
                    
                    迈进新时代
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.5.2.4" data-path="3.2.4.html">
            
                <a href="3.2.4.html">
            
                    
                    从一到无穷大
            
                </a>
            

            
        </li>
    

            </ul>
            
        </li>
    

            </ul>
            
        </li>
    
        <li class="chapter " data-level="1.6" data-path="PA4.html">
            
                <a href="PA4.html">
            
                    
                    PA4 - 来自外部的声音: 中断与I/O
            
                </a>
            

            
            <ul class="articles">
                
    
        <li class="chapter " data-level="1.6.1" data-path="4.1.html">
            
                <a href="4.1.html">
            
                    
                    穿越时空的旅程
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.6.2" data-path="4.2.html">
            
                <a href="4.2.html">
            
                    
                    时空之旅大揭秘
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.6.3" data-path="4.3.html">
            
                <a href="4.3.html">
            
                    
                    天外有天的世界
            
                </a>
            

            
        </li>
    
        <li class="chapter active" data-level="1.6.4" data-path="4.4.html">
            
                <a href="4.4.html">
            
                    
                    加入最后的拼图
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.6.5" data-path="4.5.html">
            
                <a href="4.5.html">
            
                    
                    移植打字小游戏
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.6.6" data-path="4.6.html">
            
                <a href="4.6.html">
            
                    
                    通往高速的次元
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.6.7" data-path="4.7.html">
            
                <a href="4.7.html">
            
                    
                    移植仙剑奇侠传
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.6.8" data-path="4.8.html">
            
                <a href="4.8.html">
            
                    
                    编写不朽的传奇
            
                </a>
            

            
        </li>
    

            </ul>
            
        </li>
    
        <li class="chapter " data-level="1.7" data-path="blank.html">
            
                <a href="blank.html">
            
                    
                    杂项
            
                </a>
            

            
            <ul class="articles">
                
    
        <li class="chapter " data-level="1.7.1" data-path="why.html">
            
                <a href="why.html">
            
                    
                    为什么要学习计算机系统基础
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.7.2" data-path="submit.html">
            
                <a href="submit.html">
            
                    
                    实验提交要求
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.7.3" data-path="linux.html">
            
                <a href="linux.html">
            
                    
                    Linux入门教程
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.7.4" data-path="man.html">
            
                <a href="man.html">
            
                    
                    man入门教程
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.7.5" data-path="git.html">
            
                <a href="git.html">
            
                    
                    git入门教程
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.7.6" data-path="i386-typo.html">
            
                <a href="i386-typo.html">
            
                    
                    i386手册勘误
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.7.7" data-path="name.html">
            
                <a href="name.html">
            
                    
                    学生名单
            
                </a>
            

            
            <ul class="articles">
                
    
        <li class="chapter " data-level="1.7.7.1" data-path="PA0-feedback.html">
            
                <a href="PA0-feedback.html">
            
                    
                    PA0提交情况
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.7.7.2" data-path="PA1-feedback.html">
            
                <a href="PA1-feedback.html">
            
                    
                    PA1提交情况
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.7.7.3" data-path="PA2-feedback.html">
            
                <a href="PA2-feedback.html">
            
                    
                    PA2提交情况
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.7.7.4" data-path="PA3-feedback.html">
            
                <a href="PA3-feedback.html">
            
                    
                    PA3提交情况
            
                </a>
            

            
        </li>
    

            </ul>
            
        </li>
    
        <li class="chapter " data-level="1.7.8" data-path="feedback.html">
            
                <a href="feedback.html">
            
                    
                    收集课程感想
            
                </a>
            

            
        </li>
    

            </ul>
            
        </li>
    

    

    <li class="divider"></li>

    <li>
        <a href="https://www.gitbook.com" target="blank" class="gitbook-link">
            Published with GitBook
        </a>
    </li>
</ul>


                </nav>
            
        
    </div>

    <div class="book-body">
        
            <div class="body-inner">
                
                    

<div class="book-header" role="navigation">
    

    <!-- Title -->
    <h1>
        <i class="fa fa-circle-o-notch fa-spin"></i>
        <a href="." >加入最后的拼图</a>
    </h1>
</div>




                    <div class="page-wrapper" tabindex="-1" role="main">
                        <div class="page-inner">
                            
<div id="book-search-results">
    <div class="search-noresults">
    
                                <section class="normal markdown-section">
                                
                                <h2 id="&#x52A0;&#x5165;&#x6700;&#x540E;&#x7684;&#x62FC;&#x56FE;">&#x52A0;&#x5165;&#x6700;&#x540E;&#x7684;&#x62FC;&#x56FE;</h2>
<h3 id="&#x8BBE;&#x5907;&#x4EE3;&#x7801;&#x4ECB;&#x7ECD;">&#x8BBE;&#x5907;&#x4EE3;&#x7801;&#x4ECB;&#x7ECD;</h3>
<p>&#x6846;&#x67B6;&#x4EE3;&#x7801;&#x4E2D;&#x5DF2;&#x7ECF;&#x63D0;&#x4F9B;&#x4E86;&#x8BBE;&#x5907;&#x7684;&#x4EE3;&#x7801;, &#x4F4D;&#x4E8E; <code>nemu/src/device</code> &#x76EE;&#x5F55;&#x4E0B;. &#x4EE3;&#x7801;&#x4E2D;&#x63D0;&#x4F9B;&#x4E86;&#x4E24;&#x79CD;I/O&#x5BFB;&#x5740;&#x65B9;&#x5F0F;, i8259&#x4E2D;&#x65AD;&#x63A7;&#x5236;&#x5668;&#x548C;&#x4E94;&#x79CD;&#x8BBE;&#x5907;&#x7684;&#x6A21;&#x62DF;. &#x4E3A;&#x4E86;&#x7B80;&#x5316;&#x5B9E;&#x73B0;, &#x4E2D;&#x65AD;&#x63A7;&#x5236;&#x5668;&#x548C;&#x6240;&#x6709;&#x8BBE;&#x5907;&#x90FD;&#x662F;&#x4E0D;&#x53EF;&#x7F16;&#x7A0B;&#x7684;, &#x53EA;&#x5B9E;&#x73B0;&#x4E86;&#x5728;NEMU&#x4E2D;&#x7528;&#x5230;&#x7684;&#x529F;&#x80FD;. &#x6211;&#x4EEC;&#x5BF9;&#x4EE3;&#x7801;&#x7A0D;&#x4F5C;&#x89E3;&#x91CA;.</p>
<ul>
<li><code>nemu/src/device/io/port-io.c</code> &#x662F;&#x5BF9;&#x7AEF;&#x53E3;I/O&#x7684;&#x6A21;&#x62DF;. &#x5176;&#x4E2D; <code>PIO_t</code> &#x7ED3;&#x6784;&#x7528;&#x4E8E;&#x8BB0;&#x5F55;&#x4E00;&#x4E2A;&#x7AEF;&#x53E3;I/O&#x6620;&#x5C04;&#x7684;&#x5173;&#x7CFB;, &#x8BBE;&#x5907;&#x4F1A;&#x521D;&#x59CB;&#x5316;&#x65F6;&#x4F1A;&#x8C03;&#x7528; <code>add_pio_map()</code> &#x51FD;&#x6570;&#x6765;&#x6CE8;&#x518C;&#x4E00;&#x4E2A;&#x7AEF;&#x53E3;I/O&#x6620;&#x5C04;&#x5173;&#x7CFB;, &#x8FD4;&#x56DE;&#x8BE5;&#x6620;&#x5C04;&#x5173;&#x7CFB;&#x7684;I/O&#x7A7A;&#x95F4;&#x9996;&#x5730;&#x5740;.  <code>pio_read()</code> &#x548C; <code>pio_write()</code> &#x662F;&#x9762;&#x5411;CPU&#x7684;&#x7AEF;&#x53E3;I/O&#x8BFB;&#x5199;&#x63A5;&#x53E3;. &#x7531;&#x4E8E;NEMU&#x662F;&#x5355;&#x7EBF;&#x7A0B;&#x7A0B;&#x5E8F;, &#x56E0;&#x6B64;&#x53EA;&#x80FD;&#x4E32;&#x884C;&#x6A21;&#x62DF;&#x6574;&#x4E2A;&#x8BA1;&#x7B97;&#x673A;&#x7CFB;&#x7EDF;&#x7684;&#x5DE5;&#x4F5C;, &#x6BCF;&#x6B21;&#x8FDB;&#x884C;I/O&#x8BFB;&#x5199;&#x7684;&#x65F6;&#x5019;, &#x624D;&#x4F1A;&#x8C03;&#x7528;&#x8BBE;&#x5907;&#x63D0;&#x4F9B;&#x7684;&#x56DE;&#x8C03;&#x51FD;&#x6570;(callback), &#x66F4;&#x65B0;&#x8BBE;&#x5907;&#x7684;&#x72B6;&#x6001;. &#x5185;&#x5B58;&#x6620;&#x5C04;I/O&#x7684;&#x6A21;&#x62DF;&#x548C;&#x7AEF;&#x53E3;I/O&#x7684;&#x6A21;&#x62DF;&#x6BD4;&#x8F83;&#x76F8;&#x4F3C;, &#x53EA;&#x662F;&#x5185;&#x5B58;&#x6620;&#x5C04;I/O&#x7684;&#x8BFB;&#x5199;&#x5E76;&#x4E0D;&#x662F;&#x9762;&#x5411;CPU&#x7684;, &#x8FD9;&#x4E00;&#x70B9;&#x4F1A;&#x5728;&#x4E0B;&#x6587;&#x8FDB;&#x884C;&#x8BF4;&#x660E;.</li>
<li><code>nemu/src/device/i8259.c</code> &#x662F;&#x5BF9;Intel 8259&#x4E2D;&#x65AD;&#x63A7;&#x5236;&#x5668;&#x7684;&#x529F;&#x80FD;&#x6A21;&#x62DF;. &#x4EE3;&#x7801;&#x6A21;&#x62DF;&#x4E86;&#x4E24;&#x5757;i8259&#x82AF;&#x7247;&#x7EA7;&#x8054;&#x7684;&#x60C5;&#x51B5;, &#x4ECE;&#x7247;&#x7684;INT&#x5F15;&#x811A;&#x8FDE;&#x63A5;&#x5230;&#x4E3B;&#x7247;&#x7684;IRQ2&#x5F15;&#x811A;.  <code>i8259_raise_intr()</code> &#x662F;&#x9762;&#x5411;&#x8BBE;&#x5907;&#x7684;&#x63A5;&#x53E3;, &#x5F53;&#x8BBE;&#x5907;&#x9700;&#x8981;&#x53D1;&#x51FA;&#x786C;&#x4EF6;&#x4E2D;&#x65AD;&#x65F6;, &#x5C31;&#x4F1A;&#x8C03;&#x7528; <code>i8259_raise_intr()</code> , &#x4EE3;&#x7801;&#x4F1A;&#x6839;&#x636E;&#x5F53;&#x524D;&#x7684;&#x4E2D;&#x65AD;&#x8BF7;&#x6C42;&#x72B6;&#x6001;&#x9009;&#x62E9;&#x4E00;&#x4E2A;&#x4F18;&#x5148;&#x7EA7;&#x6700;&#x9AD8;&#x7684;&#x4E2D;&#x65AD;, &#x5E76;&#x751F;&#x6210;&#x76F8;&#x5E94;&#x7684;&#x4E2D;&#x65AD;&#x53F7;, &#x628A;&#x4E2D;&#x65AD;&#x53F7;&#x8BB0;&#x5F55;&#x5728; <code>intr_NO</code> &#x53D8;&#x91CF;&#x4E2D;, &#x7136;&#x540E;&#x628A;CPU&#x7684;INTR&#x5F15;&#x811A;&#x7F6E;&#x4E3A;&#x9AD8;&#x7535;&#x5E73;, &#x901A;&#x77E5;CPU&#x6709;&#x786C;&#x4EF6;&#x4E2D;&#x65AD;&#x5230;&#x6765;. CPU&#x5982;&#x679C;&#x53D1;&#x73B0;&#x6709;&#x786C;&#x4EF6;&#x4E2D;&#x65AD;&#x5230;&#x6765;, &#x53EF;&#x4EE5;&#x901A;&#x8FC7; <code>i8259_query_intr()</code> &#x67E5;&#x8BE2;&#x5F53;&#x524D;&#x4F18;&#x5148;&#x7EA7;&#x6700;&#x9AD8;&#x7684;&#x4E2D;&#x65AD;&#x53F7;, &#x5E76;&#x8C03;&#x7528; <code>i8259_ack_intr()</code> &#x5411;&#x4E2D;&#x65AD;&#x63A7;&#x5236;&#x5668;&#x786E;&#x8BA4;&#x6536;&#x5230;&#x4E2D;&#x65AD;&#x4FE1;&#x606F;, &#x4E2D;&#x65AD;&#x63A7;&#x5236;&#x5668;&#x6536;&#x5230;CPU&#x7684;&#x786E;&#x8BA4;&#x540E;&#x4F1A;&#x66F4;&#x65B0;&#x4E2D;&#x65AD;&#x8BF7;&#x6C42;&#x7684;&#x72B6;&#x6001;, &#x6E05;&#x9664;&#x521A;&#x624D;&#x53D1;&#x9001;&#x7ED9;CPU&#x7684;&#x4E2D;&#x65AD;&#x8BF7;&#x6C42;. &#x4E3A;&#x4E86;&#x7B80;&#x5316;, &#x4E2D;&#x65AD;&#x63A7;&#x5236;&#x5668;&#x4E2D;&#x6CA1;&#x6709;&#x5B9E;&#x73B0;&#x4E2D;&#x65AD;&#x5C4F;&#x853D;&#x4F4D;&#x7684;&#x529F;&#x80FD;.</li>
<li><code>nemu/src/device/timer.c</code> &#x6A21;&#x62DF;&#x4E86;i8253&#x8BA1;&#x65F6;&#x5668;&#x7684;&#x529F;&#x80FD;. &#x8BA1;&#x65F6;&#x5668;&#x7684;&#x5927;&#x90E8;&#x5206;&#x529F;&#x80FD;&#x90FD;&#x88AB;&#x7B80;&#x5316;, &#x53EA;&#x4FDD;&#x7559;&#x4E86;&quot;&#x53D1;&#x8D77;&#x65F6;&#x949F;&#x4E2D;&#x65AD;&quot;&#x7684;&#x529F;&#x80FD;.</li>
<li><code>nemu/src/device/keyboard.c</code> &#x6A21;&#x62DF;&#x4E86;i8042&#x901A;&#x7528;&#x8BBE;&#x5907;&#x63A5;&#x53E3;&#x82AF;&#x7247;&#x7684;&#x529F;&#x80FD;. &#x5176;&#x5927;&#x90E8;&#x5206;&#x529F;&#x80FD;&#x4E5F;&#x88AB;&#x7B80;&#x5316;, &#x53EA;&#x4FDD;&#x7559;&#x4E86;&#x952E;&#x76D8;&#x63A5;&#x53E3;. i8042&#x521D;&#x59CB;&#x5316;&#x65F6;&#x4F1A;&#x6CE8;&#x518C; <code>0x60</code> &#x5904;&#x7684;&#x7AEF;&#x53E3;&#x4F5C;&#x4E3A;&#x6570;&#x636E;&#x5BC4;&#x5B58;&#x5668;, &#x6BCF;&#x5F53;&#x7528;&#x6237;&#x6572;&#x4E0B;/&#x91CA;&#x653E;&#x6309;&#x952E;&#x65F6;, &#x5C06;&#x4F1A;&#x628A;&#x952E;&#x76D8;&#x626B;&#x63CF;&#x7801;&#x653E;&#x5165;&#x6570;&#x636E;&#x5BC4;&#x5B58;&#x5668;, &#x7136;&#x540E;&#x53D1;&#x8D77;&#x952E;&#x76D8;&#x4E2D;&#x65AD;, CPU&#x6536;&#x5230;&#x4E2D;&#x65AD;&#x540E;, &#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x7AEF;&#x53E3;I/O&#x8BBF;&#x95EE;&#x6570;&#x636E;&#x5BC4;&#x5B58;&#x5668;, &#x83B7;&#x5F97;&#x952E;&#x76D8;&#x626B;&#x63CF;&#x7801;.</li>
<li><code>nemu/src/device/serial.c</code> &#x6A21;&#x62DF;&#x4E86;&#x4E32;&#x53E3;&#x7684;&#x529F;&#x80FD;. &#x5176;&#x5927;&#x90E8;&#x5206;&#x529F;&#x80FD;&#x4E5F;&#x88AB;&#x7B80;&#x5316;, &#x53EA;&#x4FDD;&#x7559;&#x4E86;&#x6570;&#x636E;&#x5BC4;&#x5B58;&#x5668;&#x548C;&#x72B6;&#x6001;&#x5BC4;&#x5B58;&#x5668;. &#x4E32;&#x53E3;&#x521D;&#x59CB;&#x5316;&#x65F6;&#x4F1A;&#x6CE8;&#x518C; <code>0x3F8</code> &#x5904;&#x957F;&#x5EA6;&#x4E3A;8&#x4E2A;&#x5B57;&#x8282;&#x7684;&#x7AEF;&#x53E3;&#x4F5C;&#x4E3A;&#x5176;&#x5BC4;&#x5B58;&#x5668;, &#x4F46;&#x4EE3;&#x7801;&#x4E2D;&#x53EA;&#x6A21;&#x62DF;&#x4E86;&#x5176;&#x4E2D;&#x7684;&#x4E24;&#x4E2A;&#x5BC4;&#x5B58;&#x5668;&#x7684;&#x529F;&#x80FD;, &#x7531;&#x4E8E;NEMU&#x4E32;&#x884C;&#x6A21;&#x62DF;&#x8BA1;&#x7B97;&#x673A;&#x7CFB;&#x7EDF;&#x7684;&#x5DE5;&#x4F5C;, &#x4E32;&#x53E3;&#x7684;&#x72B6;&#x6001;&#x5BC4;&#x5B58;&#x5668;&#x53EF;&#x4EE5;&#x4E00;&#x76F4;&#x5904;&#x4E8E;&#x7A7A;&#x95F2;&#x72B6;&#x6001;; &#x6BCF;&#x5F53;CPU&#x5F80;&#x6570;&#x636E;&#x5BC4;&#x5B58;&#x5668;&#x4E2D;&#x5199;&#x5165;&#x6570;&#x636E;&#x65F6;, &#x4E32;&#x53E3;&#x4F1A;&#x5C06;&#x6570;&#x636E;&#x4F20;&#x9001;&#x5230;&#x4E3B;&#x673A;&#x7684;&#x6807;&#x51C6;&#x8F93;&#x51FA;.</li>
<li><code>nemu/src/device/ide.c</code> &#x6A21;&#x62DF;&#x4E86;&#x78C1;&#x76D8;&#x7684;&#x529F;&#x80FD;. &#x78C1;&#x76D8;&#x521D;&#x59CB;&#x5316;&#x65F6;&#x4F1A;&#x6CE8;&#x518C; <code>0x1F0</code> &#x5904;&#x957F;&#x5EA6;&#x4E3A;8&#x4E2A;&#x5B57;&#x8282;&#x7684;&#x7AEF;&#x53E3;&#x4F5C;&#x4E3A;&#x5176;&#x5BC4;&#x5B58;&#x5668;, &#x5E76;&#x628A;NEMU&#x8FD0;&#x884C;&#x65F6;&#x4F20;&#x5165;&#x7684;&#x6D4B;&#x8BD5;&#x6587;&#x4EF6;&#x5F53;&#x505A;&#x865A;&#x62DF;&#x78C1;&#x76D8;&#x6765;&#x4F7F;&#x7528;. &#x78C1;&#x76D8;&#x8BFB;&#x5199;&#x4EE5;&#x6247;&#x533A;&#x4E3A;&#x5355;&#x4F4D;, &#x8FDB;&#x884C;&#x8BFB;&#x5199;&#x4E4B;&#x524D;, &#x78C1;&#x76D8;&#x9A71;&#x52A8;&#x7A0B;&#x5E8F;&#x9700;&#x8981;&#x628A;&#x8BFB;&#x5199;&#x7684;&#x6247;&#x533A;&#x53F7;&#x5199;&#x5165;&#x78C1;&#x76D8;&#x7684;&#x63A7;&#x5236;&#x5BC4;&#x5B58;&#x5668;, &#x7136;&#x540E;&#x5F80;&#x78C1;&#x76D8;&#x7684;&#x547D;&#x4EE4;&#x5BC4;&#x5B58;&#x5668;&#x4E2D;&#x5199;&#x5165;&#x8BFB;/&#x5199;&#x547D;&#x4EE4;&#x5B57;. &#x8FDB;&#x884C;&#x8BFB;&#x64CD;&#x4F5C;&#x65F6;, &#x9A71;&#x52A8;&#x7A0B;&#x5E8F;&#x53EF;&#x4EE5;&#x4ECE;&#x78C1;&#x76D8;&#x7684;&#x6570;&#x636E;&#x5BC4;&#x5B58;&#x5668;&#x4F9D;&#x6B21;&#x8BFB;&#x51FA;512&#x4E2A;&#x5B57;&#x8282;; &#x8FDB;&#x884C;&#x5199;&#x64CD;&#x4F5C;&#x65F6;, &#x9A71;&#x52A8;&#x7A0B;&#x5E8F;&#x9700;&#x8981;&#x5411;&#x78C1;&#x76D8;&#x7684;&#x6570;&#x636E;&#x5BC4;&#x5B58;&#x5668;&#x4F9D;&#x6B21;&#x5199;&#x5165;512&#x4E2A;&#x5B57;&#x8282;.</li>
<li><code>nemu/src/device/vga.c</code> &#x6A21;&#x62DF;&#x4E86;VGA&#x7684;&#x529F;&#x80FD;. VGA&#x521D;&#x59CB;&#x5316;&#x65F6;&#x4F1A;&#x6CE8;&#x518C;&#x4E86;&#x4E24;&#x4E2A;&#x7528;&#x4E8E;&#x66F4;&#x65B0;&#x8C03;&#x8272;&#x677F;&#x7684;&#x7AEF;&#x53E3;, &#x5E76;&#x6CE8;&#x518C;&#x4E86;&#x4ECE; <code>0xa0000</code> &#x5F00;&#x59CB;&#x7684;&#x4E00;&#x6BB5;&#x7528;&#x4E8E;&#x6620;&#x5C04;&#x5230;video memory&#x7684;&#x7269;&#x7406;&#x5185;&#x5B58;. &#x5728;NEMU&#x4E2D;, video memory&#x662F;&#x552F;&#x4E00;&#x4F7F;&#x7528;&#x5185;&#x5B58;&#x6620;&#x5C04;I/O&#x65B9;&#x5F0F;&#x8BBF;&#x95EE;&#x7684;I/O&#x7A7A;&#x95F4;. &#x4EE3;&#x7801;&#x53EA;&#x6A21;&#x62DF;&#x4E86; <code>320x200x8</code> &#x7684;&#x56FE;&#x5F62;&#x6A21;&#x5F0F;, &#x4E00;&#x4E2A;&#x50CF;&#x7D20;&#x5360;8&#x4E2A;bit&#x7684;&#x5B58;&#x50A8;&#x7A7A;&#x95F4;, &#x56E0;&#x6B64;&#x5728;&#x4E00;&#x5E45;&#x56FE;&#x4E2D;&#x6700;&#x591A;&#x80FD;&#x591F;&#x540C;&#x65F6;&#x4F7F;&#x7528;256&#x79CD;&#x989C;&#x8272;. </li>
<li><code>nemu/src/device/vga-palette.c</code> &#x5B9A;&#x4E49;&#x4E86;VGA&#x7684;&#x9ED8;&#x8BA4;&#x8C03;&#x8272;&#x677F;. &#x73B0;&#x4EE3;&#x7684;&#x663E;&#x793A;&#x5668;&#x4E00;&#x822C;&#x90FD;&#x652F;&#x6301;24&#x4F4D;&#x7684;&#x989C;&#x8272;(R, G, B&#x5404;&#x5360;8&#x4E2A;bit, &#x5171;&#x6709; <code>2^8*2^8*2^8</code> &#x7EA6;1600&#x4E07;&#x79CD;&#x989C;&#x8272;), &#x4E3A;&#x4E86;&#x8BA9;&#x5C4F;&#x5E55;&#x663E;&#x793A;&#x4E0D;&#x540C;&#x7684;&#x989C;&#x8272;&#x6210;&#x4E3A;&#x53EF;&#x80FD;, &#x5728;8&#x4F4D;&#x989C;&#x8272;&#x6DF1;&#x5EA6;&#x65F6;&#x4F1A;&#x4F7F;&#x7528;&#x8C03;&#x8272;&#x677F;&#x7684;&#x6982;&#x5FF5;. &#x8C03;&#x8272;&#x677F;&#x662F;&#x4E00;&#x4E2A;&#x989C;&#x8272;&#x4FE1;&#x606F;&#x7684;&#x6570;&#x7EC4;, &#x6BCF;&#x4E00;&#x4E2A;&#x5143;&#x7D20;&#x5360;4&#x4E2A;&#x5B57;&#x8282;, &#x5206;&#x522B;&#x4EE3;&#x8868;R(red), G(green), B(blue), A(alpha)&#x7684;&#x503C;, &#x5176;&#x4E2D;VGA&#x4E0D;&#x4F7F;&#x7528;alpha&#x7684;&#x4FE1;&#x606F;. &#x5F15;&#x5165;&#x4E86;&#x8C03;&#x8272;&#x677F;&#x7684;&#x6982;&#x5FF5;&#x4E4B;&#x540E;, &#x4E00;&#x4E2A;&#x50CF;&#x7D20;&#x5B58;&#x50A8;&#x7684;&#x5C31;&#x4E0D;&#x518D;&#x662F;&#x989C;&#x8272;&#x7684;&#x4FE1;&#x606F;, &#x800C;&#x662F;&#x4E00;&#x4E2A;&#x8C03;&#x8272;&#x677F;&#x7684;&#x7D22;&#x5F15;: &#x5177;&#x4F53;&#x6765;&#x8BF4;, &#x8981;&#x5F97;&#x5230;&#x4E00;&#x4E2A;&#x50CF;&#x7D20;&#x7684;&#x989C;&#x8272;&#x4FE1;&#x606F;, &#x5C31;&#x8981;&#x628A;&#x5B83;&#x7684;&#x503C;&#x5F53;&#x4F5C;&#x4E0B;&#x6807;, &#x5728;&#x8C03;&#x8272;&#x677F;&#x8FD9;&#x4E2A;&#x6570;&#x7EC4;&#x4E2D;&#x505A;&#x4E0B;&#x6807;&#x8FD0;&#x7B97;, &#x53D6;&#x51FA;&#x76F8;&#x5E94;&#x7684;&#x989C;&#x8272;&#x4FE1;&#x606F;. &#x56E0;&#x6B64;, &#x53EA;&#x8981;&#x4F7F;&#x7528;&#x4E0D;&#x540C;&#x7684;&#x8C03;&#x8272;&#x677F;, &#x5C31;&#x53EF;&#x4EE5;&#x5728;&#x4E0D;&#x540C;&#x7684;&#x65F6;&#x523B;&#x4F7F;&#x7528;&#x4E0D;&#x540C;&#x7684;256&#x79CD;&#x989C;&#x8272;&#x4E86;. &#x5982;&#x679C;&#x4F60;&#x5BF9;VGA&#x7F16;&#x7A0B;&#x611F;&#x5174;&#x8DA3;, <a href="http://www.osdever.net/FreeVGA/home.htm" target="_blank">&#x8FD9;&#x91CC;</a>&#x6709;&#x4E00;&#x4E2A;&#x540D;&#x4E3A;FreeVGA&#x7684;&#x9879;&#x76EE;, &#x91CC;&#x9762;&#x63D0;&#x4F9B;&#x4E86;&#x5F88;&#x591A;VGA&#x7684;&#x76F8;&#x5173;&#x8D44;&#x6599;.</li>
<li><code>nemu/src/device/sdl.c</code> &#x4E2D;&#x662F;&#x548C;SDL&#x5E93;&#x76F8;&#x5173;&#x7684;&#x4EE3;&#x7801;, NEMU&#x4F7F;&#x7528;SDL&#x5E93;&#x6765;&#x6A21;&#x62DF;&#x8BA1;&#x7B97;&#x673A;&#x7684;&#x6807;&#x51C6;&#x8F93;&#x5165;&#x8F93;&#x51FA;. &#x5728; <code>init_sdl()</code> &#x51FD;&#x6570;&#x4E2D;&#x4F1A;&#x8FDB;&#x884C;&#x4E00;&#x4E9B;&#x548C;SDL&#x76F8;&#x5173;&#x7684;&#x521D;&#x59CB;&#x5316;&#x5DE5;&#x4F5C;, &#x5305;&#x62EC;&#x521B;&#x5EFA;&#x7A97;&#x53E3;, &#x8BBE;&#x7F6E;&#x9ED8;&#x8BA4;&#x8C03;&#x8272;&#x677F;&#x7B49;. &#x6700;&#x540E;&#x8FD8;&#x4F1A;&#x6CE8;&#x518C;&#x4E00;&#x4E2A;100Hz&#x7684;&#x5B9A;&#x65F6;&#x5668;, &#x6BCF;&#x9694;0.01&#x79D2;&#x5C31;&#x4F1A;&#x8C03;&#x7528;&#x4E00;&#x6B21; <code>device_update()</code> &#x51FD;&#x6570;.  <code>device_update()</code> &#x51FD;&#x6570;&#x4E3B;&#x8981;&#x8FDB;&#x884C;&#x4E00;&#x4E9B;&#x8BBE;&#x5907;&#x7684;&#x64CD;&#x4F5C;, &#x5305;&#x62EC;&#x53D1;&#x9001;100Hz&#x7684;&#x65F6;&#x949F;&#x4E2D;&#x65AD;, &#x4EE5;25Hz&#x7684;&#x9891;&#x7387;&#x5237;&#x65B0;&#x5C4F;&#x5E55;, &#x4EE5;&#x53CA;&#x68C0;&#x6D4B;&#x662F;&#x5426;&#x6709;&#x6309;&#x952E;&#x6309;&#x4E0B;/&#x91CA;&#x653E;, &#x82E5;&#x6709;, &#x5219;&#x53D1;&#x9001;&#x952E;&#x76D8;&#x4E2D;&#x65AD;. &#x9700;&#x8981;&#x8BF4;&#x660E;&#x7684;&#x662F;, &#x4EE3;&#x7801;&#x4E2D;&#x6CE8;&#x518C;&#x7684;&#x5B9A;&#x65F6;&#x5668;&#x662F;&#x865A;&#x62DF;&#x5B9A;&#x65F6;&#x5668;, &#x5B83;&#x53EA;&#x4F1A;&#x5728;NEMU&#x5904;&#x4E8E;&#x7528;&#x6237;&#x6001;&#x7684;&#x65F6;&#x5019;&#x8FDB;&#x884C;&#x8BA1;&#x65F6;, &#x5982;&#x679C;NEMU&#x5728; <code>ui_mainloop()</code> &#x4E2D;&#x7B49;&#x5F85;&#x7528;&#x6237;&#x8F93;&#x5165;, &#x5B9A;&#x65F6;&#x5668;&#x5C06;&#x4E0D;&#x4F1A;&#x8BA1;&#x65F6;; &#x5982;&#x679C;NEMU&#x8FDB;&#x884C;&#x5927;&#x91CF;&#x7684;&#x8F93;&#x51FA;, &#x5B9A;&#x65F6;&#x5668;&#x7684;&#x8BA1;&#x65F6;&#x5C06;&#x4F1A;&#x53D8;&#x5F97;&#x7F13;&#x6162;, &#x56E0;&#x6B64;&#x9664;&#x975E;&#x4F60;&#x5728;&#x8FDB;&#x884C;&#x8C03;&#x8BD5;, &#x5426;&#x5219;&#x5C3D;&#x91CF;&#x907F;&#x514D;&#x5927;&#x91CF;&#x8F93;&#x51FA;&#x7684;&#x60C5;&#x51B5;, &#x4ECE;&#x800C;&#x5F71;&#x54CD;&#x5B9A;&#x65F6;&#x5668;&#x7684;&#x5DE5;&#x4F5C;.</li>
</ul>
<p><div class="panel"><div class="box">&#x5982;&#x4F55;&#x68C0;&#x6D4B;&#x591A;&#x4E2A;&#x952E;&#x540C;&#x65F6;&#x88AB;&#x6309;&#x4E0B;</div><div class="word-in-panel"><p>&#x4F60;&#x5E94;&#x8BE5;&#x4ECE;&#x6570;&#x5B57;&#x903B;&#x8F91;&#x7535;&#x8DEF;&#x5B9E;&#x9A8C;&#x4E2D;&#x8BA4;&#x8BC6;&#x5230;&#x548C;&#x626B;&#x63CF;&#x7801;&#x76F8;&#x5173;&#x7684;&#x5185;&#x5BB9;&#x4E86;: &#x5F53;&#x6309;&#x4E0B;&#x4E00;&#x4E2A;&#x952E;&#x7684;&#x65F6;&#x5019;, &#x952E;&#x76D8;&#x63A7;&#x5236;&#x5668;&#x5C06;&#x4F1A;&#x53D1;&#x9001;&#x8BE5;&#x952E;&#x7684;&#x901A;&#x7801;(make code); &#x5F53;&#x91CA;&#x653E;&#x4E00;&#x4E2A;&#x952E;&#x7684;&#x65F6;&#x5019;, &#x952E;&#x76D8;&#x63A7;&#x5236;&#x5668;&#x5C06;&#x4F1A;&#x53D1;&#x9001;&#x8BE5;&#x952E;&#x7684;&#x65AD;&#x7801;(break code), &#x5176;&#x4E2D;&#x65AD;&#x7801;&#x7684;&#x503C;&#x4E3A;&#x901A;&#x7801;&#x7684;&#x503C;+0x80. &#x9700;&#x8981;&#x6CE8;&#x610F;&#x7684;&#x662F;, &#x65AD;&#x7801;&#x4EC5;&#x5728;&#x952E;&#x88AB;&#x91CA;&#x653E;&#x7684;&#x65F6;&#x5019;&#x624D;&#x53D1;&#x9001;, &#x56E0;&#x6B64;&#x4F60;&#x5E94;&#x8BE5;&#x7528;&quot;&#x6536;&#x5230;&#x65AD;&#x7801;&quot;&#x6765;&#x4F5C;&#x4E3A;&#x952E;&#x88AB;&#x91CA;&#x653E;&#x7684;&#x68C0;&#x6D4B;&#x6761;&#x4EF6;, &#x800C;&#x4E0D;&#x662F;&#x7528;&quot;&#x6CA1;&#x6536;&#x5230;&#x901A;&#x7801;&quot;&#x4F5C;&#x4E3A;&#x68C0;&#x6D4B;&#x6761;&#x4EF6;.</p>
<p>&#x5728;&#x6E38;&#x620F;&#x4E2D;, &#x5F88;&#x591A;&#x65F6;&#x5019;&#x9700;&#x8981;&#x5224;&#x65AD;&#x73A9;&#x5BB6;&#x662F;&#x5426;&#x540C;&#x65F6;&#x6309;&#x4E0B;&#x4E86;&#x591A;&#x4E2A;&#x952E;, &#x4F8B;&#x5982;RPG&#x6E38;&#x620F;&#x4E2D;&#x7684;&#x516B;&#x65B9;&#x5411;&#x884C;&#x8D70;, &#x683C;&#x6597;&#x6E38;&#x620F;&#x4E2D;&#x7684;&#x7EC4;&#x5408;&#x62DB;&#x5F0F;&#x7B49;&#x7B49;. &#x6839;&#x636E;&#x952E;&#x76D8;&#x626B;&#x63CF;&#x7801;&#x7684;&#x7279;&#x6027;, &#x4F60;&#x77E5;&#x9053;&#x8FD9;&#x4E9B;&#x529F;&#x80FD;&#x662F;&#x5982;&#x4F55;&#x5B9E;&#x73B0;&#x7684;&#x5417;?</p>
</div></div></p>
<p><div class="panel"><div class="box">&#x63D0;&#x9AD8;&#x78C1;&#x76D8;&#x8BFB;&#x5199;&#x7684;&#x6548;&#x7387;</div><div class="word-in-panel"><p>&#x9605;&#x8BFB; <code>kernel/driver/ide/disk.c</code> &#x4E2D;&#x7684;&#x4EE3;&#x7801;, &#x7406;&#x89E3;kernel&#x8BFB;&#x5199;&#x78C1;&#x76D8;&#x7684;&#x65B9;&#x5F0F;. &#x4EE5;&#x8BFB;&#x64CD;&#x4F5C;&#x4E3A;&#x4F8B;, &#x4F60;&#x4F1A;&#x53D1;&#x73B0;&#x78C1;&#x76D8;&#x4E2D;&#x7684;&#x6BCF;&#x4E00;&#x4E2A;&#x6570;&#x636E;&#x90FD;&#x5148;&#x901A;&#x8FC7; <code>in</code> &#x6307;&#x4EE4;&#x8BFB;&#x5165;&#x5230;&#x5BC4;&#x5B58;&#x5668;&#x4E2D;, &#x7136;&#x540E;&#x518D;&#x901A;&#x8FC7; <code>mov</code> &#x6307;&#x4EE4;&#x628A;&#x8BFB;&#x5230;&#x7684;&#x6570;&#x636E;&#x653E;&#x56DE;&#x5185;&#x5B58;; &#x5199;&#x64CD;&#x4F5C;&#x4E5F;&#x662F;&#x7C7B;&#x4F3C;&#x7684;&#x60C5;&#x51B5;. &#x601D;&#x8003;&#x4E00;&#x4E0B;, &#x6709;&#x4EC0;&#x4E48;&#x529E;&#x6CD5;&#x80FD;&#x591F;&#x63D0;&#x9AD8;&#x78C1;&#x76D8;&#x8BFB;&#x5199;&#x7684;&#x6548;&#x7387;?</p>
</div></div></p>
<p><div class="panel"><div class="box">&#x795E;&#x5947;&#x7684;&#x8C03;&#x8272;&#x677F;</div><div class="word-in-panel"><p>&#x5728;&#x4E00;&#x4E9B;90&#x5E74;&#x4EE3;&#x7684;&#x6E38;&#x620F;&#x4E2D;, &#x5F88;&#x591A;&#x6E10;&#x51FA;&#x6E10;&#x5165;&#x6548;&#x679C;&#x90FD;&#x662F;&#x901A;&#x8FC7;&#x8C03;&#x8272;&#x677F;&#x5B9E;&#x73B0;&#x7684;, &#x806A;&#x660E;&#x7684;&#x4F60;&#x77E5;&#x9053;&#x5176;&#x4E2D;&#x7684;&#x7384;&#x673A;&#x5417;?</p>
</div></div></p>
<p>&#x6211;&#x4EEC;&#x63D0;&#x4F9B;&#x7684;&#x4EE3;&#x7801;&#x662F;&#x6A21;&#x5757;&#x5316;&#x7684;, &#x4E3A;&#x4E86;&#x8BA9;&#x65B0;&#x52A0;&#x5165;&#x7684;&#x4EE3;&#x7801;&#x5728;NEMU&#x4E2D;&#x5DE5;&#x4F5C;, &#x4F60;&#x53EA;&#x9700;&#x8981;&#x5728;&#x539F;&#x6765;&#x7684;&#x4EE3;&#x7801;&#x4E0A;&#x4F5C;&#x5C11;&#x91CF;&#x6539;&#x52A8;:</p>
<ul>
<li>&#x5728; <code>nemu/include/common.h</code> &#x4E2D;&#x5B9A;&#x4E49;&#x5B8F; <code>HAS_DEVICE</code> .</li>
<li>&#x5728;cpu&#x7ED3;&#x6784;&#x4F53;&#x4E2D;&#x6DFB;&#x52A0;&#x4E00;&#x4E2A; <code>bool</code> &#x6210;&#x5458; <code>INTR</code> , &#x8FD9;&#x4E2A;&#x6210;&#x5458;&#x7528;&#x4E8E;&#x8868;&#x793A;&#x662F;&#x5426;&#x6709;&#x5916;&#x90E8;&#x4E2D;&#x65AD;&#x5230;&#x6765;, &#x5B83;&#x4F1A;&#x5728; <code>nemu/src/device/i8259.c</code> &#x4E2D;&#x7528;&#x5230;.</li>
<li><p>&#x5728; <code>init_monitor()</code> &#x51FD;&#x6570;&#x4E2D;&#x52A0;&#x5165;&#x521D;&#x59CB;&#x5316;&#x8BBE;&#x5907;&#x548C;SDL&#x7684;&#x4EE3;&#x7801;:</p>
<div class="ace"><div class="aceCode" data-config="{&quot;edit&quot;:false,&quot;lang&quot;:&quot;c_cpp&quot;,&quot;check&quot;:false,&quot;theme&quot;:false}">init_device();
init_sdl();<br></div></div>

<p>&#x4EE3;&#x7801;&#x5728;&#x6A21;&#x62DF;&#x67D0;&#x4E9B;&#x8BBE;&#x5907;&#x7684;&#x529F;&#x80FD;&#x65F6;&#x7528;&#x5230;&#x4E86;SDL&#x5E93;, &#x4E3A;&#x4E86;&#x7F16;&#x8BD1;&#x65B0;&#x52A0;&#x5165;&#x7684;&#x4EE3;&#x7801;, &#x4F60;&#x9700;&#x8981;&#x5148;&#x5B89;&#x88C5;SDL&#x5E93;:</p>
<pre><code>apt-get install libsdl1.2-dev
</code></pre><p>&#x5B89;&#x88C5;&#x6210;&#x529F;&#x540E;, &#x4FEE;&#x6539; <code>nemu/Makefile.part</code> , &#x628A;SDL&#x5E93;&#x52A0;&#x5165;&#x94FE;&#x63A5;&#x5BF9;&#x8C61;:</p>
<div class="ace"><div class="aceCode" data-config="{&quot;edit&quot;:false,&quot;lang&quot;:&quot;diff&quot;,&quot;check&quot;:false,&quot;theme&quot;:false}">--- nemu/Makefile.part
+++ nemu/Makefile.part
@@ -4,1 +4,1 @@
-nemu_LDFLAGS := -lreadline
+nemu_LDFLAGS := -lreadline -lSDL<br></div></div>

<p>&#x4E4B;&#x540E;&#x91CD;&#x65B0;&#x7F16;&#x8BD1;.</p>
</li>
</ul>
<h3 id="&#x914D;&#x7F6E;x&#x73AF;&#x5883;">&#x914D;&#x7F6E;X&#x73AF;&#x5883;</h3>
<p>&#x5982;&#x679C;&#x4F60;&#x4F7F;&#x7528;PA0&#x4E2D;&#x7684;debian&#x865A;&#x62DF;&#x673A;&#x505A;&#x5B9E;&#x9A8C;, &#x4F60;&#x4F1A;&#x53D1;&#x73B0;&#x7F16;&#x8BD1;&#x540E;&#x8FD0;&#x884C;NEMU&#x4F1A;&#x63D0;&#x793A;&#x4EE5;&#x4E0B;&#x9519;&#x8BEF;:</p>
<pre><code>(*) DirectFB/Core: Single Application Core. (2012-05-20 13:17) 
(!) Direct/Util: opening &apos;/dev/fb0&apos; and &apos;/dev/fb/0&apos; failed
    --&gt; No such file or directory
(!) DirectFB/FBDev: Error opening framebuffer device!
(!) DirectFB/FBDev: Use &apos;fbdev&apos; option or set FRAMEBUFFER environment variable.
(!) DirectFB/Core: Could not initialize &apos;system_core&apos; core!
    --&gt; Initialization error!
nemu: src/device/sdl.c:57: init_sdl: Assertion `ret == 0&apos; failed.
(!) [ 2095:    0.000] --&gt; Caught signal 6 (unknown origin) &lt;--
</code></pre><p>&#x4E3A;&#x4E86;&#x8FD0;&#x884C;&#x52A0;&#x5165;SDL&#x5E93;&#x540E;&#x7684;NEMU, &#x4F60;&#x8FD8;&#x9700;&#x8981;&#x8FDB;&#x884C;&#x4E00;&#x4E9B;&#x989D;&#x5916;&#x7684;&#x914D;&#x7F6E;.</p>
<h4 id="&#x4E0B;&#x8F7D;x-server">&#x4E0B;&#x8F7D;X Server</h4>
<p>&#x6839;&#x636E;&#x4E3B;&#x673A;&#x64CD;&#x4F5C;&#x7CFB;&#x7EDF;&#x7684;&#x7C7B;&#x578B;, &#x4F60;&#x9700;&#x8981;&#x4E0B;&#x8F7D;&#x4E0D;&#x540C;&#x7684;X Server:</p>
<ul>
<li>Windows&#x7528;&#x6237;. &#x70B9;&#x51FB;<a href="http://sourceforge.net/project/downloading.php?group_id=156984&amp;filename=Xming-6-9-0-31-setup.exe" target="_blank">&#x8FD9;&#x91CC;</a>&#x4E0B;&#x8F7D;&#x5E76;&#x5B89;&#x88C5;Xming.</li>
<li>Mac&#x7528;&#x6237;. &#x70B9;&#x51FB;<a href="http://xquartz.macosforge.org/trac/wiki" target="_blank">&#x8FD9;&#x91CC;</a>&#x8FDB;&#x5165;XQuartz&#x5DE5;&#x7A0B;&#x7F51;&#x7AD9;, &#x4E0B;&#x8F7D;&#x5E76;&#x5B89;&#x88C5;XQuartz.</li>
<li>GNU/Linux&#x7528;&#x6237;. &#x7CFB;&#x7EDF;&#x4E2D;&#x5DF2;&#x7ECF;&#x81EA;&#x5E26;XServer, &#x4F60;&#x4E0D;&#x9700;&#x8981;&#x989D;&#x5916;&#x4E0B;&#x8F7D;.</li>
</ul>
<h4 id="&#x4E3A;ssh&#x6253;&#x5F00;x11&#x8F6C;&#x53D1;&#x529F;&#x80FD;">&#x4E3A;SSH&#x6253;&#x5F00;X11&#x8F6C;&#x53D1;&#x529F;&#x80FD;</h4>
<p>&#x6839;&#x636E;&#x4E3B;&#x673A;&#x64CD;&#x4F5C;&#x7CFB;&#x7EDF;&#x7684;&#x7C7B;&#x578B;, &#x4F60;&#x9700;&#x8981;&#x8FDB;&#x884C;&#x4E0D;&#x540C;&#x7684;&#x64CD;&#x4F5C;:</p>
<ul>
<li>Mac&#x7528;&#x6237;&#x548C;GNU/Linux&#x7528;&#x6237;. &#x8FD0;&#x884C;&#x4EE5;&#x4E0B;&#x547D;&#x4EE4;&#x5373;&#x53EF;:<pre><code>ssh -X username@ip_addr
</code></pre>&#x5176;&#x4E2D; <code>username</code> &#x662F;&#x4F60;&#x7684;&#x865A;&#x62DF;&#x673A;&#x7528;&#x6237;&#x540D;,  <code>ip_addr</code> &#x662F;eth1&#x7684;IP&#x5730;&#x5740;. &#x4F8B;&#x5982;<pre><code>ssh -X ics@192.168.56.101
</code></pre><code>-X</code> &#x9009;&#x9879;&#x4F1A;&#x4E3A;SSH&#x8FDE;&#x63A5;&#x6253;&#x5F00;X11&#x8F6C;&#x53D1;&#x529F;&#x80FD;.</li>
<li>Windows&#x7528;&#x6237;. &#x6253;&#x5F00;&#x8BB0;&#x4E8B;&#x672C;, &#x8F93;&#x5165;&#x5982;&#x4E0B;&#x5185;&#x5BB9;:<pre><code>putty.exe -X username@ip_addr
pause
</code></pre>&#x5176;&#x4E2D; <code>username</code> &#x662F;&#x4F60;&#x7684;&#x865A;&#x62DF;&#x673A;&#x7528;&#x6237;&#x540D;,  <code>ip_addr</code> &#x662F;eth1&#x7684;IP&#x5730;&#x5740;. &#x4F8B;&#x5982;<pre><code>putty.exe -X ics@192.168.56.101
pause
</code></pre>&#x7136;&#x540E;&#x5C06;&#x6587;&#x4EF6;&#x4FDD;&#x5B58;&#x5230;&#x4E0E; <code>putty.exe</code> &#x76F8;&#x540C;&#x7684;&#x76EE;&#x5F55;&#x4E0B;, &#x6587;&#x4EF6;&#x540D;&#x4E3A; <code>ssh.bat</code> . &#x4FDD;&#x5B58;&#x6210;&#x529F;&#x540E;, &#x4F60;&#x5C06;&#x4F1A;&#x770B;&#x5230;&#x4E00;&#x4E2A;&#x6279;&#x5904;&#x7406;&#x6587;&#x4EF6;(&#x76F8;&#x5F53;&#x4E8E;Windows&#x4E0B;&#x7684;&#x811A;&#x672C;&#x6587;&#x4EF6;). &#x7136;&#x540E;&#x8FD0;&#x884C;&#x521A;&#x624D;&#x4E0B;&#x8F7D;&#x7684;Xming, &#x4F60;&#x4F1A;&#x770B;&#x5230;&#x5C4F;&#x5E55;&#x53F3;&#x4E0B;&#x89D2;&#x7684;&#x4EFB;&#x52A1;&#x680F;&#x5B8F;&#x51FA;&#x73B0;&#x4E86;Xming&#x7684;&#x56FE;&#x6807;, &#x53CC;&#x51FB; <code>ssh.bat</code> &#x8FD0;&#x884C;&#x5373;&#x53EF;.</li>
</ul>
<p>&#x901A;&#x8FC7;&#x5E26;&#x6709;X11&#x8F6C;&#x53D1;&#x529F;&#x80FD;&#x7684;SSH&#x767B;&#x9646;&#x540E;, &#x4F60;&#x5C31;&#x53EF;&#x4EE5;&#x987A;&#x5229;&#x8FD0;&#x884C;&#x52A0;&#x5165;SDL&#x5E93;&#x540E;&#x7684;NEMU&#x4E86;, &#x8FD0;&#x884C;&#x65F6;&#x4F60;&#x4F1A;&#x770B;&#x5230;&#x4E00;&#x4E2A;&#x65B0;&#x7A97;&#x53E3;&#x5F39;&#x51FA;.</p>
<h3 id="&#x4F7F;&#x7528;&#x8BBE;&#x5907;&#x4EE3;&#x7801;">&#x4F7F;&#x7528;&#x8BBE;&#x5907;&#x4EE3;&#x7801;</h3>
<p>&#x4E0A;&#x8FF0;&#x4EE3;&#x7801;&#x53EA;&#x662F;&#x63D0;&#x4F9B;&#x4E86;I/O&#x5BFB;&#x5740;&#x65B9;&#x5F0F;&#x7684;&#x63A5;&#x53E3;, &#x4F60;&#x8FD8;&#x9700;&#x8981;&#x5728;NEMU&#x4E2D;&#x7F16;&#x5199;&#x76F8;&#x5E94;&#x7684;&#x4EE3;&#x7801;&#x6765;&#x8C03;&#x7528;&#x8FD9;&#x4E9B;&#x63A5;&#x53E3;. &#x5177;&#x4F53;&#x7684;, &#x4F60;&#x9700;&#x8981;:</p>
<ul>
<li>&#x5B9E;&#x73B0; <code>in</code> ,  <code>out</code> &#x6307;&#x4EE4;, &#x5728;&#x5B83;&#x4EEC;&#x7684;helper&#x51FD;&#x6570;&#x4E2D;&#x5206;&#x522B;&#x8C03;&#x7528; <code>pio_read()</code> &#x548C; <code>pio_write()</code> &#x51FD;&#x6570;.</li>
<li>&#x5728; <code>hwaddr_read()</code> &#x548C; <code>hwaddr_write()</code> &#x4E2D;&#x52A0;&#x5165;&#x5BF9;&#x5185;&#x5B58;&#x6620;&#x5C04;I/O&#x7684;&#x5224;&#x65AD;. &#x901A;&#x8FC7; <code>is_mmio()</code> &#x51FD;&#x6570;&#x5224;&#x65AD;&#x4E00;&#x4E2A;&#x7269;&#x7406;&#x5730;&#x5740;&#x662F;&#x5426;&#x88AB;&#x6620;&#x5C04;&#x5230;I/O&#x7A7A;&#x95F4;, &#x5982;&#x679C;&#x662F;,  <code>is_mmio()</code> &#x4F1A;&#x8FD4;&#x56DE;&#x6620;&#x5C04;&#x53F7;, &#x5426;&#x5219;&#x8FD4;&#x56DE; <code>-1</code> . &#x5185;&#x5B58;&#x6620;&#x5C04;I/O&#x7684;&#x8BBF;&#x95EE;&#x9700;&#x8981;&#x8C03;&#x7528; <code>mmio_read()</code> &#x6216; <code>mmio_write()</code> , &#x8C03;&#x7528;&#x65F6;&#x9700;&#x8981;&#x63D0;&#x4F9B;&#x6620;&#x5C04;&#x53F7;. &#x5982;&#x679C;&#x4E0D;&#x662F;&#x5185;&#x5B58;&#x6620;&#x5C04;I/O&#x7684;&#x8BBF;&#x95EE;, &#x5C31;&#x8BBF;&#x95EE;DRAM.</li>
</ul>
<p>&#x4F60;&#x8FD8;&#x9700;&#x8981;&#x5728;NEMU&#x4E2D;&#x6DFB;&#x52A0;&#x548C;&#x786C;&#x4EF6;&#x4E2D;&#x65AD;&#x76F8;&#x5173;&#x7684;&#x4EE3;&#x7801;:</p>
<ul>
<li><p>&#x5728; <code>cpu_exec</code> ()&#x4E2D;for&#x5FAA;&#x73AF;&#x7684;&#x672B;&#x5C3E;&#x6DFB;&#x52A0;&#x8F6E;&#x8BE2;INTR&#x5F15;&#x811A;&#x7684;&#x4EE3;&#x7801;, &#x6BCF;&#x6B21;&#x6267;&#x884C;&#x5B8C;&#x4E00;&#x6761;&#x6307;&#x4EE4;&#x5C31;&#x67E5;&#x770B;&#x662F;&#x5426;&#x6709;&#x786C;&#x4EF6;&#x4E2D;&#x65AD;&#x5230;&#x6765;:</p>
<div class="ace"><div class="aceCode" data-config="{&quot;edit&quot;:false,&quot;lang&quot;:&quot;c_cpp&quot;,&quot;check&quot;:false,&quot;theme&quot;:false}">if(cpu.INTR &amp; cpu.eflags.IF) {
  uint32_t intr_no = i8259_query_intr();
  i8259_ack_intr();
  raise_intr(intr_no);
}<br></div></div>
</li>
<li><p>&#x6DFB;&#x52A0; <code>hlt</code> &#x6307;&#x4EE4;. &#x8FD9;&#x6761;&#x6307;&#x4EE4;&#x5341;&#x5206;&#x7279;&#x6B8A;, &#x6267;&#x884C;&#x8FD9;&#x6761;&#x6307;&#x4EE4;&#x540E;, CPU&#x76F4;&#x5230;&#x786C;&#x4EF6;&#x4E2D;&#x65AD;&#x5230;&#x6765;&#x4E4B;&#x524D;&#x90FD;&#x4E0D;&#x4F1A;&#x6267;&#x884C;&#x4E0B;&#x4E00;&#x6761;&#x6307;&#x4EE4;. &#x5B9E;&#x73B0;&#x7684;&#x65F6;&#x5019;, &#x53EA;&#x9700;&#x8981;&#x5728;&#x76F8;&#x5E94;&#x7684;helper&#x51FD;&#x6570;&#x4E2D;&#x901A;&#x8FC7;&#x4E00;&#x4E2A;&#x5FAA;&#x73AF;&#x4E0D;&#x65AD;&#x67E5;&#x770B;INTR&#x5F15;&#x811A;, &#x76F4;&#x5230;&#x6EE1;&#x8DB3;&#x54CD;&#x5E94;&#x786C;&#x4EF6;&#x4E2D;&#x65AD;&#x7684;&#x6761;&#x4EF6;&#x624D;&#x9000;&#x51FA;&#x5FAA;&#x73AF;. &#x9700;&#x8981;&#x6CE8;&#x610F;&#x7684;&#x662F;, &#x5982;&#x679C;&#x5728;&#x5173;&#x4E2D;&#x65AD;&#x72B6;&#x6001;&#x4E0B;&#x6267;&#x884C; <code>hlt</code> &#x6307;&#x4EE4;, &#x54CD;&#x5E94;&#x786C;&#x4EF6;&#x4E2D;&#x65AD;&#x7684;&#x6761;&#x4EF6;&#x5C06;&#x6C38;&#x8FDC;&#x5F97;&#x4E0D;&#x5230;&#x6EE1;&#x8DB3;, CPU&#x5C06;&#x4E00;&#x76F4;&#x5904;&#x4E8E;&#x505C;&#x6B62;&#x5DE5;&#x4F5C;&#x7684;&#x72B6;&#x6001;, &#x6C38;&#x8FDC;&#x65E0;&#x6CD5;&#x6267;&#x884C;&#x4E0B;&#x4E00;&#x6761;&#x6307;&#x4EE4;. (&#x6E29;&#x99A8;&#x63D0;&#x793A;: &#x5982;&#x679C;&#x4F60;&#x53D1;&#x73B0;&#x5728;&#x5B9E;&#x73B0; <code>hlt</code> &#x6307;&#x4EE4;&#x7684;&#x65F6;&#x5019;&#x9047;&#x5230;&#x4E86;&#x56F0;&#x96BE;, &#x8BF7;&#x53C2;&#x8003;&#x672C;&#x5B9E;&#x9A8C;&#x4E2D;&#x7684;&#x67D0;&#x4E00;&#x9053;&#x84DD;&#x6846;&#x9898;.)</p>
</li>
</ul>
<p>&#x6700;&#x540E;&#x4F60;&#x9700;&#x8981;&#x5728;kernel&#x4E2D;&#x52A0;&#x5165;&#x76F8;&#x5173;&#x7684;&#x4EE3;&#x7801;, &#x4F60;&#x53EA;&#x9700;&#x8981;&#x5728; <code>kernel/include/common.h</code> &#x4E2D;&#x5B9A;&#x4E49;&#x5B8F; <code>HAS_DEVICE</code> , &#x7136;&#x540E;&#x91CD;&#x65B0;&#x7F16;&#x8BD1;kernel&#x5C31;&#x53EF;&#x4EE5;&#x4E86;. &#x91CD;&#x65B0;&#x7F16;&#x8BD1;&#x540E;, kernel&#x4F1A;&#x5728; <code>init_cond()</code> &#x51FD;&#x6570;&#x4E2D;&#x591A;&#x8FDB;&#x884C;&#x4E00;&#x4E9B;&#x548C;&#x8BBE;&#x5907;&#x76F8;&#x5173;&#x7684;&#x5DE5;&#x4F5C;:</p>
<ul>
<li>&#x521D;&#x59CB;&#x5316;i8259. &#x7531;&#x4E8E;NEMU&#x4E2D;&#x7684;i8259&#x6A21;&#x62DF;&#x5B9E;&#x73B0;&#x662F;&#x4E0D;&#x53EF;&#x7F16;&#x7A0B;&#x7684;, &#x56E0;&#x6B64;&#x5B83;&#x6CA1;&#x6709;&#x6CE8;&#x518C;&#x7AEF;&#x53E3;I/O&#x7684;&#x56DE;&#x8C03;&#x51FD;&#x6570;, &#x6545;kernel&#x4E2D;&#x5BF9;i8259&#x7684;&#x521D;&#x59CB;&#x5316;&#x5E76;&#x6CA1;&#x6709;&#x5B9E;&#x9645;&#x6548;&#x679C;.</li>
<li>&#x521D;&#x59CB;&#x5316;&#x4E32;&#x53E3;. &#x5982;&#x679C;&#x4F60;&#x7684; <code>out</code> &#x6307;&#x4EE4;&#x5B9E;&#x73B0;&#x6B63;&#x786E;, &#x521D;&#x59CB;&#x5316;&#x4E32;&#x53E3;&#x540E;, &#x4F60;&#x5C31;&#x53EF;&#x4EE5;&#x5728;kernel&#x4E2D;&#x4F7F;&#x7528; <code>Log()</code> &#x8FDB;&#x884C;&#x8F93;&#x51FA;&#x4E86;. &#x540C;&#x65F6; <code>SYS_write</code> &#x7CFB;&#x7EDF;&#x8C03;&#x7528;&#x4E5F;&#x4E0D;&#x9700;&#x8981;&#x901A;&#x8FC7;&quot;&#x9677;&#x5165;&quot;NEMU&#x6765;&#x8F93;&#x51FA;&#x4E86;, &#x4FEE;&#x6539;kernel&#x4E2D; <code>sys_write()</code> &#x7684;&#x4EE3;&#x7801;, &#x901A;&#x8FC7; <code>serial_printc()</code> &#x628A; <code>SYS_write</code> &#x7CFB;&#x7EDF;&#x8C03;&#x7528;&#x4E2D; <code>buf</code> &#x7684;&#x5185;&#x5BB9;&#x8F93;&#x51FA;&#x5230;&#x4E32;&#x53E3;.</li>
<li>&#x521D;&#x59CB;&#x5316;IDE&#x9A71;&#x52A8;&#x7A0B;&#x5E8F;.  <code>kernel/src/driver/ide</code> &#x4E2D;&#x5B9E;&#x73B0;&#x4E86;IDE&#x9A71;&#x52A8;&#x7A0B;&#x5E8F;. &#x521D;&#x59CB;&#x5316;&#x5DE5;&#x4F5C;&#x5305;&#x62EC;:<ul>
<li>&#x521D;&#x59CB;&#x5316;IDE&#x9A71;&#x52A8;&#x7A0B;&#x5E8F;&#x7684;&#x9AD8;&#x901F;&#x7F13;&#x5B58;.</li>
<li>&#x628A; <code>ide_writeback()</code> &#x51FD;&#x6570;&#x52A0;&#x5165;&#x5230;&#x65F6;&#x949F;&#x4E2D;&#x65AD;&#x7684;&#x4E2D;&#x65AD;&#x5904;&#x7406;&#x51FD;&#x6570;. &#x6BCF;&#x6B21;&#x65F6;&#x949F;&#x4E2D;&#x65AD;&#x5230;&#x8FBE;&#x7684;&#x65F6;&#x5019;,  <code>ide_writeback()</code> &#x5C06;&#x4F1A;&#x88AB;&#x8C03;&#x7528;, &#x5B83;&#x8D1F;&#x8D23;&#x6BCF;&#x7ECF;&#x8FC7;1&#x79D2;&#x5C06;&#x9AD8;&#x901F;&#x7F13;&#x5B58;&#x4E2D;&#x7684;&#x810F;&#x5757;&#x5199;&#x56DE;&#x78C1;&#x76D8;, &#x8FDB;&#x884C;&#x5199;&#x6570;&#x636E;&#x7684;&#x540C;&#x6B65;.</li>
<li>&#x628A; <code>ide_intr()</code> &#x51FD;&#x6570;&#x52A0;&#x5165;&#x5230;&#x78C1;&#x76D8;&#x4E2D;&#x65AD;&#x7684;&#x4E2D;&#x65AD;&#x5904;&#x7406;&#x51FD;&#x6570;. &#x6BCF;&#x6B21;&#x78C1;&#x76D8;&#x4E2D;&#x65AD;&#x5230;&#x8FBE;&#x7684;&#x65F6;&#x5019;,  <code>ide_intr()</code> &#x5C06;&#x4F1A;&#x88AB;&#x8C03;&#x7528;, &#x5B83;&#x8D1F;&#x8D23;&#x8BBE;&#x7F6E; <code>has_ide_intr</code> &#x6807;&#x5FD7;, &#x8BB0;&#x5F55;&#x78C1;&#x76D8;&#x4E2D;&#x65AD;&#x7684;&#x5230;&#x6765;.</li>
</ul>
</li>
<li>&#x6B64;&#x65F6;&#x5185;&#x6838;&#x7684;&#x5E95;&#x5C42;&#x521D;&#x59CB;&#x5316;&#x64CD;&#x4F5C;&#x5DF2;&#x7ECF;&#x5168;&#x90E8;&#x5B8C;&#x6210;, &#x53EF;&#x4EE5;&#x6253;&#x5F00;&#x4E2D;&#x65AD;.</li>
<li>IDE&#x9A71;&#x52A8;&#x7A0B;&#x5E8F;&#x5C01;&#x88C5;&#x4E86;&#x78C1;&#x76D8;&#x8BFB;&#x5199;&#x7684;&#x529F;&#x80FD;, &#x5E76;&#x5411;&#x4E0A;&#x5C42;&#x63D0;&#x4F9B;&#x4E86; <code>ide_read()</code> &#x548C; <code>ide_write()</code> &#x4E24;&#x4E2A;&#x65B9;&#x4FBF;&#x4F7F;&#x7528;&#x7684;&#x63A5;&#x53E3;&#x6765;&#x8BFB;&#x5199;&#x78C1;&#x76D8;. &#x7AEF;&#x53E3;I/O&#x7684;&#x529F;&#x80FD;&#x5B9E;&#x73B0;&#x6B63;&#x786E;&#x540E;, &#x6211;&#x4EEC;&#x5DF2;&#x7ECF;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;&quot;&#x771F;&#x6B63;&quot;&#x7684;&#x78C1;&#x76D8;, &#x800C;&#x4E0D;&#x9700;&#x8981;&#x4F7F;&#x7528;ramdisk&#x4E86;. &#x5B9A;&#x4E49;&#x5B8F; <code>HAS_DEVICE</code> &#x540E;,  <code>kernel/src/elf/elf.c</code> &#x4E2D;&#x7684;&#x4E00;&#x5904;&#x4EE3;&#x7801;&#x4F1A;&#x628A;&#x78C1;&#x76D8;&#x5F00;&#x59CB;&#x7684;4096&#x5B57;&#x8282;&#x8BFB;&#x5165;&#x4E00;&#x4E2A;&#x7F13;&#x51B2;&#x533A;&#x4E2D;, &#x8FD9;4096&#x5B57;&#x8282;&#x5DF2;&#x7ECF;&#x5305;&#x542B;&#x4E86;ELF&#x5934;&#x90E8;&#x548C;program header table&#x4E86;. &#x4F60;&#x9700;&#x8981;&#x4FEE;&#x6539;&#x52A0;&#x8F7D;loader&#x6A21;&#x5757;&#x7684;&#x4EE3;&#x7801;, &#x4ECE;&#x78C1;&#x76D8;&#x8BFB;&#x5165;&#x6BCF;&#x4E00;&#x4E2A;segment&#x7684;&#x5185;&#x5BB9;. &#x4FEE;&#x6539;&#x540E;, &#x628A; <code>nemu/include/common.h</code> &#x4E2D;&#x5B9A;&#x4E49;&#x7684;&#x5B8F; <code>USE_RAMDISK</code> &#x6CE8;&#x91CA;&#x6389;, ramdisk&#x5C31;&#x53EF;&#x4EE5;&#x9000;&#x4F11;&#x4E86;.</li>
<li>&#x4E3A;&#x7528;&#x6237;&#x8FDB;&#x7A0B;&#x521B;&#x5EFA;video memory&#x7684;&#x865A;&#x62DF;&#x5730;&#x5740;&#x7A7A;&#x95F4;. &#x5728; <code>loader()</code> &#x51FD;&#x6570;&#x4E2D;&#x6709;&#x4E00;&#x5904;&#x4EE3;&#x7801;&#x4F1A;&#x8C03;&#x7528; <code>create_video_mapping()</code> &#x51FD;&#x6570;(&#x5728; <code>kernel/src/memory/vmem.c</code> &#x4E2D;&#x5B9A;&#x4E49;), &#x4E3A;&#x7528;&#x6237;&#x8FDB;&#x7A0B;&#x521B;&#x5EFA;video memory&#x7684;&#x6052;&#x7B49;&#x6620;&#x5C04;, &#x5373;&#x628A;&#x4ECE; <code>0xa0000</code> &#x5F00;&#x59CB;, &#x957F;&#x5EA6;&#x4E3A; <code>320 * 200</code> &#x5B57;&#x8282;&#x7684;&#x865A;&#x62DF;&#x5185;&#x5B58;&#x533A;&#x95F4;&#x6620;&#x5C04;&#x5230;&#x4ECE; <code>0xa0000</code> &#x5F00;&#x59CB;, &#x957F;&#x5EA6;&#x4E3A; <code>320 * 200</code> &#x5B57;&#x8282;&#x7684;&#x7269;&#x7406;&#x5185;&#x5B58;&#x533A;&#x95F4;. &#x8FD9;&#x662F;PA3&#x4E2D;&#x7684;&#x4E00;&#x4E2A;&#x9009;&#x505A;&#x4EFB;&#x52A1;, &#x5982;&#x679C;&#x4F60;&#x4E4B;&#x524D;&#x6CA1;&#x6709;&#x5B9E;&#x73B0;&#x7684;&#x8BDD;, &#x73B0;&#x5728;&#x4F60;&#x9700;&#x8981;&#x9762;&#x5BF9;&#x5B83;&#x4E86;. &#x5177;&#x4F53;&#x7684;, &#x4F60;&#x9700;&#x8981;&#x5B9A;&#x4E49;&#x4E00;&#x4E9B;&#x9875;&#x8868;(&#x6CE8;&#x610F;&#x9875;&#x8868;&#x9700;&#x8981;&#x6309;&#x9875;&#x5BF9;&#x9F50;, &#x4F60;&#x53EF;&#x4EE5;&#x53C2;&#x8003; <code>kernel/src/memory/kvm.c</code> &#x4E2D;&#x7684;&#x76F8;&#x5173;&#x5185;&#x5BB9;), &#x7136;&#x540E;&#x586B;&#x5199;&#x76F8;&#x5E94;&#x7684;&#x9875;&#x76EE;&#x5F55;&#x9879;&#x548C;&#x9875;&#x8868;&#x9879;&#x5373;&#x53EF;. &#x6CE8;&#x610F;&#x4F60;&#x4E0D;&#x80FD;&#x4F7F;&#x7528; <code>mm_malloc()</code> &#x4F86;&#x5B9E;&#x73B0;video memory&#x6620;&#x5C04;&#x7684;&#x521B;&#x5EFA;, &#x56E0;&#x4E3A; <code>mm_malloc()</code> &#x5206;&#x914D;&#x7684;&#x7269;&#x7406;&#x9875;&#x9762;&#x90FD;&#x5728;16MB&#x4EE5;&#x4E0A;, &#x800C;video memory&#x4F4D;&#x4E8E;16MB&#x4EE5;&#x5185;, &#x6545;&#x4F7F;&#x7528; <code>mm_malloc()</code> &#x4E0D;&#x80FD;&#x8FBE;&#x5230;&#x6211;&#x4EEC;&#x7684;&#x76EE;&#x7684;. &#x5982;&#x679C;&#x521B;&#x5EFA;&#x5730;&#x5740;&#x7A7A;&#x95F4;&#x548C;&#x5185;&#x5B58;&#x6620;&#x5C04;I/O&#x7684;&#x5B9E;&#x73B0;&#x90FD;&#x6B63;&#x786E;, &#x4F60;&#x4F1A;&#x770B;&#x5230;&#x5C4F;&#x5E55;&#x4E0A;&#x8F93;&#x51FA;&#x4E86;&#x4E00;&#x4E9B;&#x6D4B;&#x8BD5;&#x65F6;&#x5199;&#x5165;&#x7684;&#x989C;&#x8272;&#x4FE1;&#x606F;, &#x540C;&#x65F6; <code>video_mapping_read_test()</code> &#x5C06;&#x4F1A;&#x901A;&#x8FC7;&#x68C0;&#x67E5;.</li>
</ul>
<p>&#x5230;&#x6B64;&#x4E3A;&#x6B62;, &#x968F;&#x7740;&#x8BBE;&#x5907;&#x8FD9;&#x6700;&#x540E;&#x4E00;&#x5757;&#x62FC;&#x56FE;&#x7684;&#x52A0;&#x5165;, NEMU&#x7684;&#x57FA;&#x672C;&#x529F;&#x80FD;&#x90FD;&#x5DF2;&#x7ECF;&#x5B9E;&#x73B0;&#x597D;&#x4E86;, &#x6700;&#x540E;&#x6211;&#x4EEC;&#x901A;&#x8FC7;&#x5F80;NEMU&#x4E2D;&#x79FB;&#x690D;&#x4E24;&#x4E2A;&#x6E38;&#x620F;&#x6765;&#x6D4B;&#x8BD5;&#x5B9E;&#x73B0;&#x7684;&#x6B63;&#x786E;&#x6027;.</p>
<footer class="page-footer-ex"> <span class="page-footer-ex-copyright"> By <a href="https://sashimi-yzh.github.io/" target="_blank">Zihao Yu</a>, &#x91C7;&#x7528;<a href="http://creativecommons.org/licenses/by-nc-sa/3.0/cn/" target="_blank">&#x77E5;&#x8BC6;&#x5171;&#x4EAB; &#x7F72;&#x540D;-&#x975E;&#x5546;&#x4E1A;&#x6027;&#x4F7F;&#x7528;-&#x76F8;&#x540C;&#x65B9;&#x5F0F;&#x5171;&#x4EAB; 3.0 &#x4E2D;&#x56FD;&#x5927;&#x9646; &#x8BB8;&#x53EF;&#x534F;&#x8BAE;</a>&#x53D1;&#x5E03; </span> &#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; <span class="page-footer-ex-footer-update"> &#x6B64;&#x9875;&#x9762;&#x4FEE;&#x8BA2;&#x4E8E;:  2019-05-03 18:37:10 </span> </footer>
                                
                                </section>
                            
    </div>
    <div class="search-results">
        <div class="has-results">
            
            <h1 class="search-results-title"><span class='search-results-count'></span> results matching "<span class='search-query'></span>"</h1>
            <ul class="search-results-list"></ul>
            
        </div>
        <div class="no-results">
            
            <h1 class="search-results-title">No results matching "<span class='search-query'></span>"</h1>
            
        </div>
    </div>
</div>

                        </div>
                    </div>
                
            </div>

            
                
                <a href="4.3.html" class="navigation navigation-prev " aria-label="Previous page: 天外有天的世界">
                    <i class="fa fa-angle-left"></i>
                </a>
                
                
                <a href="4.5.html" class="navigation navigation-next " aria-label="Next page: 移植打字小游戏">
                    <i class="fa fa-angle-right"></i>
                </a>
                
            
        
    </div>

    <script>
        var gitbook = gitbook || [];
        gitbook.push(function() {
            gitbook.page.hasChanged({"page":{"title":"加入最后的拼图","level":"1.6.4","depth":2,"next":{"title":"移植打字小游戏","level":"1.6.5","depth":2,"path":"4.5.md","ref":"4.5.md","articles":[]},"previous":{"title":"天外有天的世界","level":"1.6.3","depth":2,"path":"4.3.md","ref":"4.3.md","articles":[]},"dir":"ltr"},"config":{"gitbook":"3.x.x","theme":"default","variables":{},"plugins":["localized-footer","page-footer-ex","ace","nestedmd","mdinhtml"],"pluginsConfig":{"ace":{},"page-footer-ex":{"copyright":"By [Zihao Yu](https://sashimi-yzh.github.io/), 采用[知识共享 署名-非商业性使用-相同方式共享 3.0 中国大陆 许可协议](http://creativecommons.org/licenses/by-nc-sa/3.0/cn/)发布","markdown":true,"update_format":"YYYY-MM-DD HH:mm:ss","update_label":"此页面修订于: "},"mdinhtml":{},"search":{},"localized-footer":{"filename":"FOOTER.md","hline":"true"},"lunr":{"maxIndexSize":1000000,"ignoreSpecialCharacters":false},"nestedmd":{},"fontsettings":{"theme":"white","family":"sans","size":2},"highlight":{},"sharing":{"facebook":true,"twitter":true,"google":false,"weibo":false,"instapaper":false,"vk":false,"all":["facebook","google","twitter","weibo","instapaper"]},"theme-default":{"styles":{"website":"styles/website.css","pdf":"styles/pdf.css","epub":"styles/epub.css","mobi":"styles/mobi.css","ebook":"styles/ebook.css","print":"styles/print.css"},"showLevel":false}},"structure":{"langs":"LANGS.md","readme":"README.md","glossary":"GLOSSARY.md","summary":"SUMMARY.md"},"pdf":{"pageNumbers":true,"fontSize":12,"fontFamily":"Arial","paperSize":"a4","chapterMark":"pagebreak","pageBreaksBefore":"/","margin":{"right":62,"left":62,"top":56,"bottom":56}},"styles":{"website":"styles.css","pdf":"styles.css"}},"file":{"path":"4.4.md","mtime":"2019-05-03T10:37:10.923Z","type":"markdown"},"gitbook":{"version":"3.2.3","time":"2019-05-03T10:38:47.530Z"},"basePath":".","book":{"language":""}});
        });
    </script>
</div>

        
    <script src="gitbook/gitbook.js"></script>
    <script src="gitbook/theme.js"></script>
    
        
        <script src="gitbook/gitbook-plugin-ace/ace/ace.js"></script>
        
    
        
        <script src="gitbook/gitbook-plugin-ace/ace.js"></script>
        
    
        
        <script src="gitbook/gitbook-plugin-search/search-engine.js"></script>
        
    
        
        <script src="gitbook/gitbook-plugin-search/search.js"></script>
        
    
        
        <script src="gitbook/gitbook-plugin-lunr/lunr.min.js"></script>
        
    
        
        <script src="gitbook/gitbook-plugin-lunr/search-lunr.js"></script>
        
    
        
        <script src="gitbook/gitbook-plugin-sharing/buttons.js"></script>
        
    
        
        <script src="gitbook/gitbook-plugin-fontsettings/fontsettings.js"></script>
        
    

    </body>
</html>

